#include "../include/mouse.h"
#include "../include/defs.h"
#define byte unsigned char

typedef struct {
	int	x;
	int	y;
} point;

typedef struct {
	byte	izq;
	byte	der;
	point	pos;
} mouseSt;



mouseSt mouse = {0,0,{0,0}};
byte first, second, third;
int qty_int = 0;
extern TIMERINT;

/*
 * Función que decodifica los datos enviados por el mouse.
 * Recibe el dato como un int b.
 */



void 
leomouse (int b){

	static word timer=65535;
	static int mouseClickIzq = 0, mouseClickDer = 0;

	
	/*
	 * qty_int indica la cantidad de veces que interrumpió el mouse.
	 * Como se reciben 3 bytes por cada movimiento, entonces dependiendo
	 * del valor de qty_int se asigna a la variable que corresponda.
	 */

	switch(qty_int){
		case 0:	first = (byte)b;break;
		case 1:	second = (byte)b;break;
		case 2:	third = (byte)b;qty_int=-1;break;
		default: first = (byte)b;
	}
	qty_int++; 
	
	/* Solo se updatea el estado del mouse 1 vez cada 3 interrupciones */
	if(!(qty_int)) {
	    mouseClickIzq = mouse.izq;
	    mouseClickDer = mouse.der;
	    updateMouse();

	if (!mouse.izq && mouseClickIzq){
	    /* Si hizo click y no se estaba sosteniendo, 
	    entonces inicio la selección */
		if(TIMERINT==1){
			timer-=TIMER_ACCEL;
		
			if(timer < 0x0001) {
			timer = 0x0001;
			}
			word a  = _timerTick(timer);
		
		
			printf("%d\n", a);
		
		}
	    }
	    if(!mouse.der && mouseClickDer){
	    /* Si se hizo click derecho y no se estaba
	    sosteniendo entonces pego */

		if(TIMERINT==1){

			timer+=TIMER_ACCEL;		
			if(timer > 65535) {
				timer = 65535;
			}
			word a  = _timerTick(timer);
		
			printf("%d\n", a);
		}
		
	    }
	}
	return;   
}


void 
updateMouse(void){

    int dx,dy;
    point possible;

    /* Si se recibe un 1 en el 8 bit o en el bit 7 del primer 
    byte recibido del mouse, eso indica que hay overflow */
    if(!(first & 0x80 || first & 0x40)){
        /* Se setean los botones del mouse dependiendo si 
	están apretados o no */
	if(first & 0x02) {
	    mouse.der = 1;
	}
	else if(!(first & 0x02)) {
	    mouse.der = 0;
	}
	if(first & 0x01) {
	    mouse.izq = 1;
	}
	else if(!(first & 0x01)) {
	    mouse.izq = 0;
	}
    }
    return;
}     

